<!DOCTYPE html>
<!-- saved from url=(0127)https://docs.google.com/document/d/e/2PACX-1vQ-gcSRm3vkj90gM5xmleCrbZK0U7PVT5I670VTcZdUbYusAHfUPnWeQZJro7xMoes4xLn-hGvukzoP/pub -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>WebPerfWG call - September 10th 2020</title><link rel="shortcut icon" href="https://ssl.gstatic.com/docs/documents/images/kix-favicon7.ico"><meta name="referrer" content="strict-origin-when-cross-origin"><style type="text/css" nonce="">
      @import url("https://fonts.googleapis.com/css?family=Google+Sans");
      @import url("https://fonts.googleapis.com/css?family=Roboto");

      body {
        font-family: Roboto, arial, sans, sans-serif;
        margin: 0;
      }

      iframe {
        border: 0;
        frameborder: 0;
        height: 100%;
        width: 100%;
      }

      #header {
        align-items: center;
        background: white;
        border-bottom: 1px #ccc solid;
        display: flex;
        height: 60px;
        justify-content: space-between;
        position: fixed;
        top: 0;
        width: 100%;
        z-index: 100;
      }

      #header #title {
        font-family: 'Google Sans';
        font-size: large;
        margin: auto 0 auto 20px;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
        width: 70%;
      }

      #header #interval {
        margin: auto 25px auto 0;
        font-family: Roboto;
        font-size: small;;
      }

      #footer {
        background: #f0f0f0;
        border-bottom: 1px #ccc solid;
        bottom: 0;
        font-family: Roboto;
        font-size: small;
        padding: 10px 10px;
        position: fixed;
        text-align: center;
        width: 100%;
      }

      #contents {
        padding: 100px 20% 50px 20%;
      }

      @media only screen and (max-device-width: 800px) {
        #header {
          border-bottom-width: 5px;
          height: auto;
          display: block;
        }

        #header #title {
          font-size: 3em;
          margin: auto 0 auto 20px;
          width: 90%;
        }

        #header #interval {
          font-size: 1.5em;
          margin: 10px 0 auto 25px;
        }

        #contents {
          padding: 150px 5% 80px;
        }

        #footer {
          font-size: 2em;
        }
      }

      .dash {
        padding: 0 6px;
      }
    </style></head><body><div id="header"><div id="title">WebPerfWG call - September 10th 2020</div><div id="interval"><span></span></div></div><div id="contents"><style type="text/css">.lst-kix_c3j85jktq9w4-7>li:before{content:"\0025cb  "}.lst-kix_c3j85jktq9w4-0>li:before{content:"\0025cf  "}.lst-kix_c3j85jktq9w4-1>li:before{content:"\0025cb  "}.lst-kix_c3j85jktq9w4-8>li:before{content:"\0025a0  "}li.li-bullet-0:before{margin-left:-18pt;white-space:nowrap;display:inline-block;min-width:18pt}.lst-kix_c3j85jktq9w4-3>li:before{content:"\0025cf  "}.lst-kix_c3j85jktq9w4-2>li:before{content:"\0025a0  "}ul.lst-kix_c3j85jktq9w4-8{list-style-type:none}ul.lst-kix_c3j85jktq9w4-5{list-style-type:none}ul.lst-kix_c3j85jktq9w4-4{list-style-type:none}.lst-kix_c3j85jktq9w4-6>li:before{content:"\0025cf  "}ul.lst-kix_c3j85jktq9w4-7{list-style-type:none}ul.lst-kix_c3j85jktq9w4-6{list-style-type:none}ul.lst-kix_c3j85jktq9w4-1{list-style-type:none}ul.lst-kix_c3j85jktq9w4-0{list-style-type:none}.lst-kix_c3j85jktq9w4-4>li:before{content:"\0025cb  "}.lst-kix_c3j85jktq9w4-5>li:before{content:"\0025a0  "}ul.lst-kix_c3j85jktq9w4-3{list-style-type:none}ul.lst-kix_c3j85jktq9w4-2{list-style-type:none}ol{margin:0;padding:0}table td,table th{padding:0}.c1{margin-left:36pt;padding-top:0pt;padding-left:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c3{margin-left:72pt;padding-top:0pt;padding-left:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c4{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:16pt;font-family:"Arial";font-style:normal}.c8{padding-top:18pt;padding-bottom:6pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c11{padding-top:16pt;padding-bottom:4pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c7{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left;height:11pt}.c9{color:#434343;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:14pt;font-family:"Arial";font-style:normal}.c0{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c12{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c10{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;color:#1155cc;text-decoration:underline}.c13{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c5{padding:0;margin:0}.c6{color:inherit;text-decoration:inherit}.c2{font-weight:700}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}</style><div class="c13"><h2 class="c8" id="h.snf34ny0pjes"><span class="c4">Participants</span></h2><p class="c12"><span class="c0">Nic Jansma, Yoav Weiss, Benjamin De Kosnik, Andrew Galloni, Carine Bournez, Peter Perlepes, Nicol&aacute;s Pe&ntilde;a, Sean Feng, Chris Harrleson, Michal Mocny, Phil Walton, Thomas Kelly, Michelle Vu, Dom Farolino</span></p><h2 class="c8" id="h.nv3j5u7j58z5"><span class="c4">Next call September 24th @ 10PM</span></h2><h2 class="c8" id="h.n4z6m522w7b7"><span class="c4">Minutes</span></h2><h3 class="c11" id="h.2tovz25q0vmp"><span class="c9">Largest Contentful Paint</span></h3><p class="c12"><span class="c10"><a class="c6" href="https://www.google.com/url?q=https://github.com/WICG/largest-contentful-paint/issues/43%23issuecomment-685905450&amp;sa=D&amp;source=editors&amp;ust=1613234051491000&amp;usg=AOvVaw0w7gFkAx6nk5WbhzfWo6Nu">Call back to indicate that the observer is about to stop</a></span><span class="c0">&nbsp;(Nicol&aacute;s)</span></p><ul class="c5 lst-kix_c3j85jktq9w4-0 start"><li class="c1 li-bullet-0"><span class="c10"><a class="c6" href="https://www.google.com/url?q=https://docs.google.com/presentation/d/1Ll8hMdr7SIqIKLWYf6Nw-5dJQha45BsNQWVHQDzAiSI/edit%23slide%3Did.p&amp;sa=D&amp;source=editors&amp;ust=1613234051492000&amp;usg=AOvVaw1CxwZr-c6uptinErwzf17o">Final LCP</a></span><span class="c0">&nbsp;slides</span></li><li class="c1 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: Currently hard to know when the LCP algorithm stopped</span></li><li class="c1 li-bullet-0"><span class="c0">… Also a problem when the page is hidden, as timestamps after that are not useful, because no paints happen when the user is in the background</span></li><li class="c1 li-bullet-0"><span class="c0">... So wanted to present “Final LCP”</span></li><li class="c1 li-bullet-0"><span class="c0">... Problems: latest candidate with lower start time</span></li><li class="c1 li-bullet-0"><span class="c0">... e.g. image vs. text where the image takes longer to load and doesn’t have TAO</span></li><li class="c1 li-bullet-0"><span class="c0">... Also the fact that removed elements are no longer LCP candidates complicates things</span></li><li class="c1 li-bullet-0"><span class="c0">... Could have a large image loading by the time the user is loading the page (or unloads the page)</span></li><li class="c1 li-bullet-0"><span class="c0">... So LCP wasn't "reached"</span></li><li class="c1 li-bullet-0"><span class="c0">... Any user of the API would just assume the last candidate was the LCP</span></li><li class="c1 li-bullet-0"><span class="c0">... No reliable way to know when LCP has stopped. Users may look at page visibility, but it’s hard to know when to stop based on inputs, and adding event listeners is an anti pattern</span></li><li class="c1 li-bullet-0"><span class="c0">... Currently developers can listen forever, but the latest is not guaranteed to be the actual LCP, and waiting forever is not practical</span></li><li class="c1 li-bullet-0"><span class="c0">... Proposal, expose final-lcp when algorithm stops (user input) or when page becomes hidden.</span></li><li class="c1 li-bullet-0"><span class="c0">... Thinking of adding a separate entry type</span></li><li class="c1 li-bullet-0"><span class="c0">... Alternatively, we can break the current users and override the current LCP semantics</span></li><li class="c1 li-bullet-0"><span class="c0">... Similar to FCP, so could be exposed in the performance timeline</span></li><li class="c1 li-bullet-0"><span class="c0">... Need to specify that the entry is available before visibilityChange fires</span></li><li class="c1 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: So the only time we’d be able to emit this final-lcp is on user input or when the page is hidden. So it won’t be available at `onload`, right?</span></li><li class="c1 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: Right. Do we final-lcp at first-hidden or as it gets unloaded? The first hidden is the true place where you’d stop looking at LCP. </span></li><li class="c1 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: For Boomerang, we capture LCP. &nbsp;We beacon up at onload time, so if we continue capturing that this way, a single beacon at page load event, we’d probably never see this final LCP, because we don’t wait that long</span></li><li class="c1 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: What happens if onload is early?</span></li><li class="c1 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: For SPAs we do something else, but waiting for the page to finish activity and then beacon things up</span></li><li class="c1 li-bullet-0"><span class="c0">… but not waiting until the page is hidden to send the data</span></li><li class="c1 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: So if you don’t change the way you send the data, this will not work for you?</span></li><li class="c1 li-bullet-0"><span class="c0"><b>Nic</b>: Not in the way we send data today.</span></li><li class="c1 li-bullet-0"><span class="c0">... Most other analytics packages also send data earlier.</span></li><li class="c1 li-bullet-0"><span class="c0">... You can do some stitching together of data at the back-end if you want to to send two beacons (at onload and unload/hidden), but that can be more complex</span></li><li class="c1 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: Have you found the visibility change event to also be unreliable?</span></li><li class="c1 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: There’s also a balance of trying to get realtime data. We try to send some data early on</span></li><li class="c1 li-bullet-0"><span class="c0">… We do send beacons on unload, but we get ~70% of beacons. About 30% of the time unload doesn’t fire</span></li><li class="c1 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: So seems like we need to keep the candidates around -- less reliable but may be easier to use</span></li><li class="c1 li-bullet-0"><span class="c2">Phil</span><span class="c0"><b></b>: Question for Nic - do you track the first visibilityChange as well? Do you know what its reliability is?</span></li><li class="c1 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: We log those timestamps if they happen before onload, but don’t beacon at that point</span></li><li class="c1 li-bullet-0"><span class="c2">Phil</span><span class="c0"><b></b>: Would you be able to also send a beacon at visibility change?</span></li><li class="c1 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: We try to send the data at page hide…</span></li><li class="c1 li-bullet-0"><span class="c2">Phil</span><span class="c0"><b></b>: Trying to get real world reliability of visibility change</span></li><li class="c1 li-bullet-0"><span class="c2">Michal</span><span class="c0"><b></b>: As a followup, what about post load analytics?</span></li><li class="c1 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: Measure LayoutShift up until the load event. Stitching is possible, but tradeoff vs. real time analytics</span></li><li class="c1 li-bullet-0"><span class="c2">Benjamin</span><span class="c0"><b></b>: Naming - Final LCP is not great. &nbsp;Can we do First and Last?</span></li><li class="c1 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: What does Last mean here in that context though?</span></li><li class="c1 li-bullet-0"><span class="c2">Benjamin</span><span class="c0"><b></b>: I'd like to expose the range of paints</span></li><li class="c1 li-bullet-0"><span class="c2">Yoav</span><span class="c0"><b></b>: I've heard of folks gathering LCP and are having trouble understanding when the last LCP candidate has fired.</span></li><li class="c1 li-bullet-0"><span class="c0">... Not a big fan of "Final" here -- there could be additional paints that are smaller</span></li><li class="c1 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: For an SPA, there could also be more paints happening</span></li><li class="c1 li-bullet-0"><span class="c2">Ben</span><span class="c0"><b></b>: Would it make sense to split out SPAs from this discussion?</span></li><li class="c1 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: Even for MPAs, “last” can be confusing because there can be paint following user input. This is the “largest” paint before that.</span></li><li class="c1 li-bullet-0"><span class="c0">... Take a point on “final” not being great. More important - who wants this?</span></li><li class="c1 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: We alone don't represent the industry! &nbsp;Sees the value in ergonomics.</span></li><li class="c1 li-bullet-0"><span class="c2">Yoav</span><span class="c0"><b></b>: If you could replace the load event you have with paints, would it be a good event to hang analytics on?</span></li><li class="c1 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: Potentially, combined with a timeout</span></li><li class="c1 li-bullet-0"><span class="c2">Andrew</span><span class="c0"><b></b>: We’d be interested in such an event</span></li><li class="c1 li-bullet-0"><span class="c2">Peter</span><span class="c0"><b></b>: Makes more sense than adding event listeners</span></li><li class="c1 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: To move forward on this issue - should we solicit more feedback first?</span></li><li class="c1 li-bullet-0"><span class="c0">… I can reach out to get more eyeballs on the proposal</span></li><li class="c1 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: And we should consider better names</span></li></ul><p class="c7"><span class="c0"></span></p><p class="c7"><span class="c0"></span></p><h3 class="c11" id="h.w5di05pa6y8b"><span class="c9">Preload</span></h3><ul class="c5 lst-kix_c3j85jktq9w4-0"><li class="c1 li-bullet-0"><span class="c10"><a class="c6" href="https://www.google.com/url?q=https://github.com/w3c/preload/issues/147&amp;sa=D&amp;source=editors&amp;ust=1613234051500000&amp;usg=AOvVaw2E3bNTVu4l2PXLgslS_Zqo">preload #147 - "Delay the load event" should happen in HTML</a></span></li></ul><ul class="c5 lst-kix_c3j85jktq9w4-1 start"><li class="c3 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: Should we discuss that at all?</span></li><li class="c3 li-bullet-0"><span class="c2">Yoav</span><span><b></b>: Probably not</span></li></ul><ul class="c5 lst-kix_c3j85jktq9w4-0"><li class="c1 li-bullet-0"><span class="c10"><a class="c6" href="https://www.google.com/url?q=https://github.com/w3c/preload/issues/153&amp;sa=D&amp;source=editors&amp;ust=1613234051501000&amp;usg=AOvVaw2A2Yufuw9_yZC0-qPNC310">preload #153 - Remove "Dependencies" section</a></span></li></ul><ul class="c5 lst-kix_c3j85jktq9w4-1 start"><li class="c3 li-bullet-0"><span class="c2">Dom</span><span class="c0"><b></b>: If we're going to moving the spec processing model into the HTML standard anyways, is it worth doing these now?</span></li><li class="c3 li-bullet-0"><span class="c2">Yoav</span><span><b></b>: I don't think we need to do that, we can see with Philippe when the move to HTML will happen</span></li></ul><ul class="c5 lst-kix_c3j85jktq9w4-0"><li class="c1 li-bullet-0"><span class="c10"><a class="c6" href="https://www.google.com/url?q=https://github.com/w3c/preload/pull/149&amp;sa=D&amp;source=editors&amp;ust=1613234051501000&amp;usg=AOvVaw3jK7djncZqT1WE_nZl1QRp">preload #149 - Add an attribute to hint the server which headers to copy in push requests</a></span></li></ul><ul class="c5 lst-kix_c3j85jktq9w4-1 start"><li class="c3 li-bullet-0"><span class="c2">Yoav</span><span class="c0"><b></b>: Underlying issue is people want to add hints to servers to modify the way H2 push is done</span></li><li class="c3 li-bullet-0"><span class="c0">... Two issues: Whether it makes sense to add content-based hint for servers to do what they currently don't do</span></li><li class="c3 li-bullet-0"><span class="c0">... Somehow sneaked various push-related behaviors into preload, and we maybe shouldn't have</span></li><li class="c3 li-bullet-0"><span class="c0">... Doesn't make sense to define those server-push related behaviors in the preload spec</span></li><li class="c3 li-bullet-0"><span class="c0">... Would rather it happen as part of server push, separated from preload</span></li><li class="c3 li-bullet-0"><span class="c0">... There's also "nopush" which isn't really defined anywhere but is used in examples here</span></li><li class="c3 li-bullet-0"><span class="c2">Andrew</span><span class="c0"><b></b>: I agree</span></li><li class="c3 li-bullet-0"><span class="c2">Yoav</span><span><b></b>: AI to comment on the issue and open a separate issue that push-related hints should be split apart</span></li></ul><ul class="c5 lst-kix_c3j85jktq9w4-0"><li class="c1 li-bullet-0"><span class="c0">PerformanceTimeline</span></li></ul><ul class="c5 lst-kix_c3j85jktq9w4-1 start"><li class="c3 li-bullet-0"><span class="c10"><a class="c6" href="https://www.google.com/url?q=https://github.com/w3c/performance-timeline/issues/105&amp;sa=D&amp;source=editors&amp;ust=1613234051502000&amp;usg=AOvVaw0CjRvE-BSBUpjkljjROZ4K">PerformanceEntries are affected by backgrounded status</a></span></li><li class="c3 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: Wanted to chat about this, but no one from Apple is on the call.</span></li><li class="c3 li-bullet-0"><span class="c0">… there’s some confusion about the use cases - some related to throttling and some related to visibility</span></li><li class="c3 li-bullet-0"><span class="c0">… Need to be careful to support both of them</span></li><li class="c3 li-bullet-0"><span class="c0">... e.g. paint metrics are really impacted by visibility, but other metrics might be impacted by throttling</span></li><li class="c3 li-bullet-0"><span class="c0">... Wanted 3 types: visibility, network status (full vs. throttled), CPU usage</span></li><li class="c3 li-bullet-0"><span class="c0">... Already exposing visibility, exposing the other 2 would make sense and wondered if people have concrete use cases beyond “taintedness”</span></li><li class="c3 li-bullet-0"><span class="c0">... Also wanted to ask thoughts about API shape</span></li><li class="c3 li-bullet-0"><span class="c0">... I was working on VisibiltyStateEntry which would not be extensible</span></li><li class="c3 li-bullet-0"><span class="c0">... Should we have an API that covers all those 3 states, have them separate, what’s a good name, etc</span></li><li class="c3 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: Like the idea of getting more transparency into CPU and network usage</span></li><li class="c3 li-bullet-0"><span class="c0">... Might be good to have it all under a single API.</span></li><li class="c3 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: Historically, the group pushed back on exposing throttling signals, but it’s become common in some cases, so even if we can’t define granularity of throttling, I think it makes sense to expose it to taint entries to some degree</span></li><li class="c3 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: If developer tools are open, that can also taint measurements</span></li><li class="c3 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: Good point</span></li><li class="c3 li-bullet-0"><span class="c2">Yoav</span><span class="c0"><b></b>: Dev Tools open would in fact CPU throttling, it's not a different dimension, but a different reason</span></li><li class="c3 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: People can use devtools to do many things, pausing execution, etc. &nbsp;And we’d like to separate those experiences. So there could be other dimensions - code breakpointing</span></li><li class="c3 li-bullet-0"><span class="c2">Timo</span><span class="c0"><b></b>: I am skeptical of the utility of this information. We currently use visibility state to drop entries. But over time, it’s part of a larger range of real world experiences. If throttling happens in the foreground, why should it be separated. That’s a real world experience.</span></li><li class="c3 li-bullet-0"><span class="c0">… So interested in high level use cases. Would we ignore the data? How would that affect user experiences?</span></li><li class="c3 li-bullet-0"><span class="c0">… also having memory distress, disk space distress is also a form of throttling</span></li><li class="c3 li-bullet-0"><span class="c0">… It helps to get a stable baseline, but it also blinds us to non “standard” cases</span></li><li class="c3 li-bullet-0"><span class="c2">Nic</span><span class="c0"><b></b>: I want to mark that data not to throw it, but to add it as a dimension</span></li><li class="c3 li-bullet-0"><span class="c2">Michal</span><span><b></b>: </span><span class="c0">A stable baseline feels it’s interesting, but we shouldn’t throw out too much real world data</span></li><li class="c3 li-bullet-0"><span class="c2">Michel</span><span class="c0"><b></b>: In Pinterest we’re collecting puppeteer and RUM data and synthetic tests are not enough to create a baseline. </span></li><li class="c3 li-bullet-0"><span class="c0">... Plenty of regressions at RUM P90 from our deploys. &nbsp;So this API would be useful for us. &nbsp;We could ignore traces with throttling.</span></li><li class="c3 li-bullet-0"><span class="c2">Nicol&aacute;s</span><span class="c0"><b></b>: Ignoring throttling would make the data a bit more stable, but real life is still messy.</span></li><li class="c3 li-bullet-0"><span class="c0">... Important to do analysis of data at a given point in time, and this can exclude cases you don’t have control over. </span></li><li class="c3 li-bullet-0"><span class="c2">Steven</span><span class="c0"><b></b>: Interest from SalesForce as well</span></li><li class="c3 li-bullet-0"><span class="c2">Michel</span><span class="c0"><b></b>: On top of devtools, there are scenarios where we have very small data, and want to filter open devtools. When the team debugs a page, we’re affecting our own data.</span></li><li class="c3 li-bullet-0"><span class="c2">Timo</span><span class="c0"><b></b>: Supportive of a devtools signal. Visibility is different than the others, because users are likely not impacted (other than geeks looking at spinners)</span></li><li class="c3 li-bullet-0"><span class="c2">Peter</span><span><b></b>: Agree with Timo that exposing this can have mixed uses, so having a baseline of what throttling means would be helpful. We could have the impact of people discarding data that represents real users.</span></li></ul></div></div><div id="footer"><span>Published by <a target="_blank" title="Learn more about Google Drive" href="https://docs.google.com/">Google Drive</a></span><span class="dash">–</span><a href="https://docs.google.com/u/0/abuse?id=AKkXjox0pcux128MpA9mLTpKvm7DSTslMYmY0FttdYi1bS4PmGr5VbOJs7YP1pWqDTYhTZYZoOdcrPRDyXQBBNg:0">Report Abuse</a></div><script type="text/javascript" nonce="">(function(){/*

 Copyright The Closure Library Authors.
 SPDX-License-Identifier: Apache-2.0
*/
var aa="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};function ba(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");}var ca=ba(this);
function da(a,b){if(b)a:{var c=ca;a=a.split(".");for(var d=0;d<a.length-1;d++){var e=a[d];if(!(e in c))break a;c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&aa(c,a,{configurable:!0,writable:!0,value:b})}}var ea="function"==typeof Object.create?Object.create:function(a){function b(){}b.prototype=a;return new b},fa;
if("function"==typeof Object.setPrototypeOf)fa=Object.setPrototypeOf;else{var ha;a:{var ia={a:!0},ja={};try{ja.__proto__=ia;ha=ja.a;break a}catch(a){}ha=!1}fa=ha?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+" is not extensible");return a}:null}var ka=fa;
function h(a,b){a.prototype=ea(b.prototype);a.prototype.constructor=a;if(ka)ka(a,b);else for(var c in b)if("prototype"!=c)if(Object.defineProperties){var d=Object.getOwnPropertyDescriptor(b,c);d&&Object.defineProperty(a,c,d)}else a[c]=b[c];a.o=b.prototype}da("Object.is",function(a){return a?a:function(b,c){return b===c?0!==b||1/b===1/c:b!==b&&c!==c}});var l=this||self;function la(){}function ma(a){var b=typeof a;return"object"==b&&null!=a||"function"==b}
function na(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();d.push.apply(d,arguments);return a.apply(this,d)}}function oa(a,b){function c(){}c.prototype=b.prototype;a.o=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.B=function(d,e,f){for(var g=Array(arguments.length-2),k=2;k<arguments.length;k++)g[k-2]=arguments[k];return b.prototype[e].apply(d,g)}}function pa(a){return a};var qa=Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b,void 0)}:function(a,b){if("string"===typeof a)return"string"!==typeof b||1!=b.length?-1:a.indexOf(b,0);for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1};function ra(a,b,c){for(var d in a)b.call(c,a[d],d,a)};var m;function p(a,b){this.i=a===sa&&b||"";this.j=ta}p.prototype.h=!0;p.prototype.g=function(){return this.i};var ta={},sa={};var ua=String.prototype.trim?function(a){return a.trim()}:function(a){return/^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]},va=/&/g,wa=/</g,xa=/>/g,ya=/"/g,za=/'/g,Aa=/\x00/g,Ba=/[\x00&<>"']/;function Ca(a,b){return a<b?-1:a>b?1:0};function q(a,b){this.i=b===r?a:""}q.prototype.h=!0;q.prototype.g=function(){return this.i.toString()};q.prototype.toString=function(){return this.i.toString()};function u(a){return a instanceof q&&a.constructor===q?a.i:"type_error:SafeUrl"}
var Da=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-matroska|x-wav|wav|webm)|font\/\w+|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|video\/(?:mpeg|mp4|ogg|webm|quicktime|x-matroska))(?:;\w+=(?:\w+|"[\w;,= ]+"))*$/i,Ea=/^data:(.*);base64,[a-z0-9+\/]+=*$/i,Fa=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;function Ga(a){if(a instanceof q)return a;a="object"==typeof a&&a.h?a.g():String(a);Fa.test(a)||(a="about:invalid#zClosurez");return new q(a,r)}
var r={},Ha=new q("about:invalid#zClosurez",r);var v;a:{var Ia=l.navigator;if(Ia){var Ja=Ia.userAgent;if(Ja){v=Ja;break a}}v=""}function w(a){return-1!=v.indexOf(a)};function x(a,b,c){this.i=c===Ka?a:""}x.prototype.h=!0;x.prototype.g=function(){return this.i.toString()};x.prototype.toString=function(){return this.i.toString()};var Ka={};function La(a,b,c,d){a=a instanceof q?a:Ga(a);b=b||l;c=c instanceof p?c instanceof p&&c.constructor===p&&c.j===ta?c.i:"type_error:Const":c||"";return void 0!==d?b.open(u(a),c,d,void 0):b.open(u(a),c)};function Ma(a){Ma[" "](a);return a}Ma[" "]=la;function y(a,b,c){return Object.prototype.hasOwnProperty.call(a,b)?a[b]:a[b]=c(b)};var Na=w("Opera"),z=w("Trident")||w("MSIE"),Oa=w("Edge"),Pa=Oa||z,Qa=w("Gecko")&&!(-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"))&&!(w("Trident")||w("MSIE"))&&!w("Edge"),Ra=-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"),Sa=w("Macintosh");function Ta(){var a=l.document;return a?a.documentMode:void 0}var Ua;
a:{var Va="",Wa=function(){var a=v;if(Qa)return/rv:([^\);]+)(\)|;)/.exec(a);if(Oa)return/Edge\/([\d\.]+)/.exec(a);if(z)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(Ra)return/WebKit\/(\S+)/.exec(a);if(Na)return/(?:Version)[ \/]?(\S+)/.exec(a)}();Wa&&(Va=Wa?Wa[1]:"");if(z){var Xa=Ta();if(null!=Xa&&Xa>parseFloat(Va)){Ua=String(Xa);break a}}Ua=Va}var Ya=Ua,Za={},$a;if(l.document&&z){var ab=Ta();$a=ab?ab:parseInt(Ya,10)||void 0}else $a=void 0;var bb=$a;function cb(a){return y(a.prototype,"$$generatedClassName",function(){return"Class$obf_"+{valueOf:function(){return++db}}})}var db=1E3;function A(){}A.prototype.u=function(){return this.j||(Object.defineProperties(this,{j:{value:++eb,enumerable:!1}}),this.j)};A.prototype.toString=function(){var a=B(fb(gb(this.constructor)))+"@";var b=(this.u()>>>0).toString(16);return a+B(b)};function D(){}h(D,A);D.prototype.i=function(a){this.h=a;if(a instanceof Object)try{a.A=this}catch(b){}};function hb(a){a.h instanceof Error&&(Error.captureStackTrace?Error.captureStackTrace(a.h):a.h.stack=Error().stack)}D.prototype.toString=function(){var a=fb(gb(this.constructor)),b=this.l;return null==b?a:B(a)+": "+B(b)};function ib(){}h(ib,D);function jb(){}h(jb,ib);var eb=0;function E(){}h(E,jb);E.prototype.i=function(a){jb.prototype.i.call(this,Object.is(this.g,"__noinit__")?a:this.g)};function kb(){}h(kb,E);function lb(a,b){return"string"==typeof a?a.charCodeAt(b):a.g(b)};function B(a){return null==a?"null":a.toString()}function mb(a){return 65536<=a?B(String.fromCharCode((55296+((a-65536|0)>>10&1023)|0)&65535))+B(String.fromCharCode((56320+((a-65536|0)&1023)|0)&65535)):String.fromCharCode(a&65535)}function nb(a,b){var c=b,d=a.length,e;b=lb(a,(e=c,c=c+1|0,e));var f;if(e=55296<=b&&56319>=b&&c<d)a=f=lb(a,c),e=56320<=a&&57343>=a;var g;e?g=65536+((b&1023)<<10)+(f&1023)|0:g=b;return g};function ob(a,b){this.h=a;this.g=b}h(ob,A);function fb(a){var b=cb(a.h);0!=a.g&&(b="L"+B(b)+";");a=a.g;for(var c="",d=0;d<a;d=d+1|0)c=B(c)+"[";return B(c)+B(b)}ob.prototype.toString=function(){return"class "+B(fb(this))};function gb(a){var b=0;return y(a.prototype,"$$class/"+b,function(){return new ob(a,b)})};function pb(a,b){return null==a?a:b?decodeURI(a):decodeURIComponent(a)};var qb=/^(?:([^:/?#.]+):)?(?:\/\/(?:([^/?#]*)@)?([^/#?]*?)(?::([0-9]+))?(?=[/#?]|$))?([^?#]+)?(?:\?([^#]*))?(?:#([\S\s]*))?$/;function rb(a){a=qb.exec(a);for(var b=[],c=0;7>=c;c=c+1|0)a.length<=c||null==a[c]?b.push(null):b.push(a[c]);return b}
function sb(a,b){var c=a.indexOf(mb(35));c=0>c?a.length:c;a:{var d=0;for(var e=b.length;0<(d=a.indexOf(b,d))&&d<c;){var f=nb(a,d-1|0);if(38==f||63==f){if((d+e|0)>=a.length)break a;f=nb(a,d+e|0);if(61==f||38==f||35==f)break a}d=d+(e+1)|0}d=-1}if(0>d)return null;e=a.indexOf(mb(38),d);if(0>e||e>c)e=c;d=d+(b.length+1)|0;b=Math.min(a.length,d);a=a.substr(b,Math.min(a.length,Math.max(d,e))-b|0);c=" ";for(b=0;0<=(b=c.indexOf("\\",b));)36==c.charCodeAt(b+1|0)?(d=B(c.substr(0,b|0))+"$",e=b=b+1|0,c=d+B(c.substr(e))):
(d=B(c.substr(0,b|0)),e=b=b+1|0,c=d+B(c.substr(e)));a=a.replace(/\+/g,c);return pb(a,!1)};function F(a,b){this.h=b;for(var c=[],d=!0,e=a.length-1;0<=e;e--){var f=a[e]|0;d&&f==b||(c[e]=f,d=!1)}this.g=c}var tb={};function ub(a){return-128<=a&&128>a?y(tb,a,function(b){return new F([b|0],0>b?-1:0)}):new F([a|0],0>a?-1:0)}function G(a){if(isNaN(a)||!isFinite(a))return H;if(0>a)return I(G(-a));for(var b=[],c=1,d=0;a>=c;d++)b[d]=a/c|0,c*=4294967296;return new F(b,0)}var H=ub(0),J=ub(1),vb=ub(16777216);
function K(a){if(-1==a.h)return-K(I(a));for(var b=0,c=1,d=0;d<a.g.length;d++){var e=L(a,d);b+=(0<=e?e:4294967296+e)*c;c*=4294967296}return b}F.prototype.toString=function(a){a=a||10;if(2>a||36<a)throw Error("radix out of range: "+a);if(M(this))return"0";if(-1==this.h)return"-"+I(this).toString(a);for(var b=G(Math.pow(a,6)),c=this,d="";;){var e=wb(c,b).g;c=N(c,O(e,b));var f=((0<c.g.length?c.g[0]:c.h)>>>0).toString(a);c=e;if(M(c))return f+d;for(;6>f.length;)f="0"+f;d=f+d}};
function L(a,b){return 0>b?0:b<a.g.length?a.g[b]:a.h}function M(a){if(0!=a.h)return!1;for(var b=0;b<a.g.length;b++)if(0!=a.g[b])return!1;return!0}function P(a,b){a=N(a,b);return-1==a.h?-1:M(a)?0:1}function I(a){for(var b=a.g.length,c=[],d=0;d<b;d++)c[d]=~a.g[d];return(new F(c,~a.h)).add(J)}F.prototype.abs=function(){return-1==this.h?I(this):this};
F.prototype.add=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0,e=0;e<=b;e++){var f=d+(L(this,e)&65535)+(L(a,e)&65535),g=(f>>>16)+(L(this,e)>>>16)+(L(a,e)>>>16);d=g>>>16;f&=65535;g&=65535;c[e]=g<<16|f}return new F(c,c[c.length-1]&-2147483648?-1:0)};function N(a,b){return a.add(I(b))}
function O(a,b){if(M(a)||M(b))return H;if(-1==a.h)return-1==b.h?O(I(a),I(b)):I(O(I(a),b));if(-1==b.h)return I(O(a,I(b)));if(0>P(a,vb)&&0>P(b,vb))return G(K(a)*K(b));for(var c=a.g.length+b.g.length,d=[],e=0;e<2*c;e++)d[e]=0;for(e=0;e<a.g.length;e++)for(var f=0;f<b.g.length;f++){var g=L(a,e)>>>16,k=L(a,e)&65535,t=L(b,f)>>>16,n=L(b,f)&65535;d[2*e+2*f]+=k*n;Q(d,2*e+2*f);d[2*e+2*f+1]+=g*n;Q(d,2*e+2*f+1);d[2*e+2*f+1]+=k*t;Q(d,2*e+2*f+1);d[2*e+2*f+2]+=g*t;Q(d,2*e+2*f+2)}for(e=0;e<c;e++)d[e]=d[2*e+1]<<16|
d[2*e];for(e=c;e<2*c;e++)d[e]=0;return new F(d,0)}function Q(a,b){for(;(a[b]&65535)!=a[b];)a[b+1]+=a[b]>>>16,a[b]&=65535,b++}function S(a,b){this.g=a;this.h=b}
function wb(a,b){if(M(b))throw Error("division by zero");if(M(a))return new S(H,H);if(-1==a.h)return b=wb(I(a),b),new S(I(b.g),I(b.h));if(-1==b.h)return b=wb(a,I(b)),new S(I(b.g),b.h);if(30<a.g.length){if(-1==a.h||-1==b.h)throw Error("slowDivide_ only works with positive integers.");for(var c=J,d=b;0>=P(d,a);)c=xb(c,1),d=xb(d,1);var e=T(c,1),f=T(d,1);d=T(d,2);for(c=T(c,2);!M(d);){var g=f.add(d);0>=P(g,a)&&(e=e.add(c),f=g);d=T(d,1);c=T(c,1)}b=N(a,O(e,b));return new S(e,b)}for(e=H;0<=P(a,b);){c=Math.max(1,
Math.floor(K(a)/K(b)));d=Math.ceil(Math.log(c)/Math.LN2);d=48>=d?1:Math.pow(2,d-48);f=G(c);for(g=O(f,b);-1==g.h||0<P(g,a);)c-=d,f=G(c),g=O(f,b);M(f)&&(f=J);e=e.add(f);a=N(a,g)}return new S(e,a)}F.prototype.and=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)&L(a,d);return new F(c,this.h&a.h)};F.prototype.or=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)|L(a,d);return new F(c,this.h|a.h)};
F.prototype.xor=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)^L(a,d);return new F(c,this.h^a.h)};function xb(a,b){var c=b>>5;b%=32;for(var d=a.g.length+c+(0<b?1:0),e=[],f=0;f<d;f++)e[f]=0<b?L(a,f-c)<<b|L(a,f-c-1)>>>32-b:L(a,f-c);return new F(e,a.h)}function T(a,b){var c=b>>5;b%=32;for(var d=a.g.length-c,e=[],f=0;f<d;f++)e[f]=0<b?L(a,f+c)>>>b|L(a,f+c+1)<<32-b:L(a,f+c);return new F(e,a.h)};N(xb(J,32),J);N(xb(J,128),J);function yb(a){a&&"function"==typeof a.v&&a.v()};function U(){this.h=this.h;this.g=this.g}U.prototype.h=!1;U.prototype.v=function(){this.h||(this.h=!0,this.j())};U.prototype.j=function(){if(this.g)for(;this.g.length;)this.g.shift()()};var zb=!z||9<=Number(bb),Ab=!z||9<=Number(bb),Bb=z&&!y(Za,"9",function(){for(var a=0,b=ua(String(Ya)).split("."),c=ua("9").split("."),d=Math.max(b.length,c.length),e=0;0==a&&e<d;e++){var f=b[e]||"",g=c[e]||"";do{f=/(\d*)(\D*)(.*)/.exec(f)||["","","",""];g=/(\d*)(\D*)(.*)/.exec(g)||["","","",""];if(0==f[0].length&&0==g[0].length)break;a=Ca(0==f[1].length?0:parseInt(f[1],10),0==g[1].length?0:parseInt(g[1],10))||Ca(0==f[2].length,0==g[2].length)||Ca(f[2],g[2]);f=f[3];g=g[3]}while(0==a)}return 0<=a}),
Cb=function(){if(!l.addEventListener||!Object.defineProperty)return!1;var a=!1,b=Object.defineProperty({},"passive",{get:function(){a=!0}});try{l.addEventListener("test",la,b),l.removeEventListener("test",la,b)}catch(c){}return a}();function Db(a,b){this.type=a;this.g=this.target=b;this.defaultPrevented=!1}Db.prototype.h=function(){this.defaultPrevented=!0};function V(a,b){Db.call(this,a?a.type:"");this.relatedTarget=this.g=this.target=null;this.button=this.screenY=this.screenX=this.clientY=this.clientX=0;this.key="";this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.pointerId=0;this.pointerType="";this.i=null;if(a){var c=this.type=a.type,d=a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:null;this.target=a.target||a.srcElement;this.g=b;if(b=a.relatedTarget){if(Qa){a:{try{Ma(b.nodeName);var e=!0;break a}catch(f){}e=
!1}e||(b=null)}}else"mouseover"==c?b=a.fromElement:"mouseout"==c&&(b=a.toElement);this.relatedTarget=b;d?(this.clientX=void 0!==d.clientX?d.clientX:d.pageX,this.clientY=void 0!==d.clientY?d.clientY:d.pageY,this.screenX=d.screenX||0,this.screenY=d.screenY||0):(this.clientX=void 0!==a.clientX?a.clientX:a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0);this.button=a.button;this.key=a.key||"";this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=
a.shiftKey;this.metaKey=a.metaKey;this.pointerId=a.pointerId||0;this.pointerType="string"===typeof a.pointerType?a.pointerType:Eb[a.pointerType]||"";this.state=a.state;this.i=a;a.defaultPrevented&&V.o.h.call(this)}}oa(V,Db);var Fb=[1,4,2],Eb={2:"touch",3:"pen",4:"mouse"};V.prototype.h=function(){V.o.h.call(this);var a=this.i;if(a.preventDefault)a.preventDefault();else if(a.returnValue=!1,Bb)try{if(a.ctrlKey||112<=a.keyCode&&123>=a.keyCode)a.keyCode=-1}catch(b){}};var Gb="closure_listenable_"+(1E6*Math.random()|0);var Hb=0;function Ib(a,b,c,d,e){this.listener=a;this.g=null;this.src=b;this.type=c;this.capture=!!d;this.h=e;this.key=++Hb;this.m=this.s=!1}function Jb(a){a.m=!0;a.listener=null;a.g=null;a.src=null;a.h=null};function Kb(a){this.src=a;this.g={};this.h=0}Kb.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.g[f];a||(a=this.g[f]=[],this.h++);var g;a:{for(g=0;g<a.length;++g){var k=a[g];if(!k.m&&k.listener==b&&k.capture==!!d&&k.h==e)break a}g=-1}-1<g?(b=a[g],c||(b.s=!1)):(b=new Ib(b,this.src,f,!!d,e),b.s=c,a.push(b));return b};function Lb(a,b){var c=b.type;if(c in a.g){var d=a.g[c],e=qa(d,b),f;(f=0<=e)&&Array.prototype.splice.call(d,e,1);f&&(Jb(b),0==a.g[c].length&&(delete a.g[c],a.h--))}};var Mb="closure_lm_"+(1E6*Math.random()|0),Nb={},Ob=0;function Pb(a,b,c,d,e){if(d&&d.once)return Qb(a,b,c,d,e);if(Array.isArray(b)){for(var f=0;f<b.length;f++)Pb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!1,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!1,d,e)}
function Sb(a,b,c,d,e,f){if(!b)throw Error("Invalid event type");var g=ma(e)?!!e.capture:!!e,k=Tb(a);k||(a[Mb]=k=new Kb(a));c=k.add(b,c,d,g,f);if(c.g)return c;d=Ub();c.g=d;d.src=a;d.listener=c;if(a.addEventListener)Cb||(e=g),void 0===e&&(e=!1),a.addEventListener(b.toString(),d,e);else if(a.attachEvent)a.attachEvent(Vb(b.toString()),d);else if(a.addListener&&a.removeListener)a.addListener(d);else throw Error("addEventListener and attachEvent are unavailable.");Ob++;return c}
function Ub(){var a=Wb,b=Ab?function(c){return a.call(b.src,b.listener,c)}:function(c){c=a.call(b.src,b.listener,c);if(!c)return c};return b}function Qb(a,b,c,d,e){if(Array.isArray(b)){for(var f=0;f<b.length;f++)Qb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!0,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!0,d,e)}
function Xb(a){if("number"!==typeof a&&a&&!a.m){var b=a.src;if(b&&b[Gb])Lb(b.g,a);else{var c=a.type,d=a.g;b.removeEventListener?b.removeEventListener(c,d,a.capture):b.detachEvent?b.detachEvent(Vb(c),d):b.addListener&&b.removeListener&&b.removeListener(d);Ob--;(c=Tb(b))?(Lb(c,a),0==c.h&&(c.src=null,b[Mb]=null)):Jb(a)}}}function Vb(a){return a in Nb?Nb[a]:Nb[a]="on"+a}
function Yb(a,b,c,d){var e=!0;if(a=Tb(a))if(b=a.g[b.toString()])for(b=b.concat(),a=0;a<b.length;a++){var f=b[a];f&&f.capture==c&&!f.m&&(f=Zb(f,d),e=e&&!1!==f)}return e}function Zb(a,b){var c=a.listener,d=a.h||a.src;a.s&&Xb(a);return c.call(d,b)}
function Wb(a,b){if(a.m)return!0;if(!Ab){if(!b)a:{b=["window","event"];for(var c=l,d=0;d<b.length;d++)if(c=c[b[d]],null==c){b=null;break a}b=c}d=b;b=new V(d,this);c=!0;if(!(0>d.keyCode||void 0!=d.returnValue)){a:{var e=!1;if(0==d.keyCode)try{d.keyCode=-1;break a}catch(g){e=!0}if(e||void 0==d.returnValue)d.returnValue=!0}d=[];for(e=b.g;e;e=e.parentNode)d.push(e);a=a.type;for(e=d.length-1;0<=e;e--){b.g=d[e];var f=Yb(d[e],a,!0,b);c=c&&f}for(e=0;e<d.length;e++)b.g=d[e],f=Yb(d[e],a,!1,b),c=c&&f}return c}return Zb(a,
new V(b,this))}function Tb(a){a=a[Mb];return a instanceof Kb?a:null}var $b="__closure_events_fn_"+(1E9*Math.random()>>>0);function Rb(a){if("function"===typeof a)return a;a[$b]||(a[$b]=function(b){return a.handleEvent(b)});return a[$b]};function W(a){U.call(this);this.l=a;this.i={}}oa(W,U);var ac=[];function bc(a){ra(a.i,function(b,c){this.i.hasOwnProperty(c)&&Xb(b)},a);a.i={}}W.prototype.j=function(){W.o.j.call(this);bc(this)};W.prototype.handleEvent=function(){throw Error("EventHandler.handleEvent not implemented");};function cc(a){U.call(this);this.i=a||document.body;this.l=new W(this);a=na(yb,this.l);this.h?a():(this.g||(this.g=[]),this.g.push(a));a=this.l;var b=this.i,c=this.u,d="click";Array.isArray(d)||(d&&(ac[0]=d.toString()),d=ac);for(var e=0;e<d.length;e++){var f=Pb(b,d[e],c||a.handleEvent,!1,a.l||a);if(!f)break;a.i[f.key]=f}}h(cc,U);
cc.prototype.u=function(a){if(!(!(zb?0==a.i.button:"click"==a.type||a.i.button&Fb[0])||Sa&&a.ctrlKey||a.defaultPrevented))for(var b=a.target;b&&b!=this.i;){if(b.tagName&&"a"==b.tagName.toLowerCase()){var c=b.getAttribute("href")||b.getAttributeNS("http://www.w3.org/1999/xlink","href"),d=c;try{var e=rb(c)[3];var f;if(f="www.google.com"===pb(e,!0)){var g=rb(c)[5];f="/url"===pb(g,!0)}if(f){var k=sb(c,"q");d=k?k:sb(c,"url")}}catch(C){a:{var t=C;if(null!=t){var n=t.A;if(null!=n){C=n;break a}}if(t instanceof
TypeError){var R=n=new kb;R.l=B(t);hb(R);n.g="__noinit__";n.g=t;n.i(new TypeError(n));t=n}else R=n=new E,R.l=B(t),hb(R),n.g="__noinit__",n.g=t,n.i(Error(n)),t=n;C=t}if(!(C instanceof ib))throw C.h;}d=null!=d?d:"";if(c!=d){e=void 0;b={target:"_blank",noreferrer:!0};c=window;d instanceof q?f=d:(f="undefined"!=typeof d.href?d.href:String(d),f instanceof q||(f="object"==typeof f&&f.h?f.g():String(f),Fa.test(f)?f=new q(f,r):(f=String(f),f=f.replace(/(%0A|%0D)/g,""),f=(g=f.match(Ea))&&Da.test(g[1])?new q(f,
r):null)),f=f||Ha);d=b.target||d.target;g=[];for(e in b)switch(e){case "width":case "height":case "top":case "left":g.push(e+"="+b[e]);break;case "target":case "noopener":case "noreferrer":break;default:g.push(e+"="+(b[e]?1:0))}e=g.join(",");if((w("iPhone")&&!w("iPod")&&!w("iPad")||w("iPad")||w("iPod"))&&c.navigator&&c.navigator.standalone&&d&&"_self"!=d)e="A",g=document,e=String(e),"application/xhtml+xml"===g.contentType&&(e=e.toLowerCase()),g=e=g.createElement(e),f=f instanceof q?f:Ga(f),g.href=
u(f),e.setAttribute("target",d),b.noreferrer&&e.setAttribute("rel","noreferrer"),b=document.createEvent("MouseEvent"),b.initMouseEvent("click",!0,!0,c,1),e.dispatchEvent(b);else if(b.noreferrer){if(c=La("",c,d,e),b=u(f),c){Pa&&-1!=b.indexOf(";")&&(b="'"+b.replace(/'/g,"%27")+"'");c.opener=null;Ba.test(b)&&(-1!=b.indexOf("&")&&(b=b.replace(va,"&amp;")),-1!=b.indexOf("<")&&(b=b.replace(wa,"&lt;")),-1!=b.indexOf(">")&&(b=b.replace(xa,"&gt;")),-1!=b.indexOf('"')&&(b=b.replace(ya,"&quot;")),-1!=b.indexOf("'")&&
(b=b.replace(za,"&#39;")),-1!=b.indexOf("\x00")&&(b=b.replace(Aa,"&#0;")));b='<meta name="referrer" content="no-referrer"><meta http-equiv="refresh" content="0; url='+b+'">';if(void 0===m)if(d=null,(e=l.trustedTypes)&&e.createPolicy){try{d=e.createPolicy("goog#html",{createHTML:pa,createScript:pa,createScriptURL:pa})}catch(C){l.console&&l.console.error(C.message)}m=d}else m=d;b=(d=m)?d.createHTML(b):b;b=new x(b,null,Ka);(c=c.document)&&c.write&&(c.write(b instanceof x&&b.constructor===x?b.i:"type_error:SafeHtml"),
c.close())}}else(c=La(f,c,d,e))&&b.noopener&&(c.opener=null);a.h();break}}b=b.parentNode}};function dc(a){new cc(a)}var X=["DOCS_installLinkReferrerSanitizer"],Y=l;X[0]in Y||"undefined"==typeof Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());)X.length||void 0===dc?Y[Z]&&Y[Z]!==Object.prototype[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=dc;}).call(this);
</script><script type="text/javascript" nonce="">DOCS_installLinkReferrerSanitizer();</script></body></html>